#include "AD.h"
void AD_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    RCC_ADCCLKConfig(RCC_PCLK2_Div6); // 设置分频系数，72MHz/6=12MHz，不能超过14MHz,

    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; // 模拟输入模式，数字输入被断开
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 更快的转换选择更小的参数，更稳定的装换选择]
    ADC_InitTypeDef ADC_InitStructure;
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                  // 独立ADC模式，ADC1和ADC2分开转化
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;              // 12位对比存入uint16_t对齐方式，右对齐
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; // 外部触发源，不触发使用软件触发
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;                 // 是否为连续转换模式，
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;                       // 是否为扫描模式(多通道)
    ADC_InitStructure.ADC_NbrOfChannel = 1;                             // 通道数目(非扫描模式无意义)
    ADC_Init(ADC1, &ADC_InitStructure);

    // 此处可以配置中断，看门狗

    // 开启ADC
    ADC_Cmd(ADC1, ENABLE);

    // 校准ADC
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1) == SET);
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1) == SET);    
}


uint16_t AD_GetValue(uint8_t ADC_Channel){
    ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5);
    ADC_SoftwareStartConvCmd(ADC1,ENABLE);
    while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);//转换完成后EOC置1
    return ADC_GetConversionValue(ADC1);//读取DR寄存器，自动清理EOC标志位

}
